package com.walker;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class FolderReader {

    /**
     * 从输入字符串中提取所有符合 yyyymmdd、yyyymmdd-n 或 yyyymmdd+n 格式的数据。
     * 如果没有匹配到符合条件的数据，则返回包含原始 input 的列表。
     *
     * @param input 输入字符串
     * @return 匹配到的数据列表或包含原始 input 的列表
     */
    public static List<String> extractAllDates(String input) {
        List<String> matchedDates = new ArrayList<>();
        String regex = "\\d{4}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])([+-]\\d+)?";

        // 编译正则表达式
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);

        // 查找所有匹配的数据
        while (matcher.find()) {
            String matchedData = matcher.group();
            if (isValidDate(matchedData)) {
                matchedDates.add(matchedData);
            }
        }

        // 如果没有匹配到数据，返回包含原始 input 的列表
        if (matchedDates.isEmpty()) {
            matchedDates.add(input);
        }

        return matchedDates;
    }

    /**
     * 验证日期是否有效。
     *
     * @param dateStr 日期字符串
     * @return 是否有效
     */
    private static boolean isValidDate(String dateStr) {
        try {
            // 提取 yyyymmdd 部分
            String yyyymmdd = dateStr.replaceAll("[+-]\\d+", "");
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
            LocalDate.parse(yyyymmdd, formatter);
            return true;
        } catch (DateTimeParseException e) {
            return false;
        }
    }

    public static void main(String[] args) {
        // 测试用例
        String input1 = "这是一个包含日期的字符串20230917，以及20230817+5和20230917+10。";
        String input2 = "这个字符串没有日期数据。";

        // 调用方法
        List<String> result1 = extractAllDates(input1);
        List<String> result2 = extractAllDates(input2);

        // 输出结果
        System.out.println("结果 1: " + result1); // 输出所有匹配到的数据
        System.out.println("结果 2: " + result2); // 输出包含原始 input 的列表
    }
}